package com.basic.technology.study.introduction.thread.jmm;

public class JmmTest {

    public static boolean flag = true;

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() ->{
            System.out.println("线程" + Thread.currentThread().getName() + " in");
            while (flag) {
                ;
            }
            System.out.println("线程" + Thread.currentThread().getName() + "停止了");
        });
        t1.start();
        //休眠1秒
        Thread.sleep(1000);
        //将flag置为false
        flag = false;
    }

    /**
     * 线程t1的run()方法中有个循环，通过flag来控制循环是否结束，主线程中休眠了1秒，将flag置为false，按说此时线程t1会检测到flag为false，
     * 打印“线程t1停止了”，为何和我们期望的结果不一样呢？
     * 运行上面的代码我们可以判断，t1中看到的flag一直为ture，主线程将flag置为false之后，t1线程中没有看到，所以一直死循环。
     *
     * 那么t1中为什么看不到被主线程修改之后的flag？
     *
     * 要解释这个，我们需要先了解一下java内存模型（JMM），Java线程之间的通信由Java内存模型（本文简称为JMM）控制，JMM决定一个线程对共享变量的写入何时对另一个线程可见。
     * 从抽象的角度来看，JMM定义了线程和主内存之间的抽象关系：线程之间的共享变量存储在主内存（main memory）中，每个线程都有一个私有的本地内存（local memory），
     * 本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念，并不真实存在。它涵盖了缓存，写缓冲区，寄存器以及其他的硬件和编译器优化。
     *
     */
}
